<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>新特性</title>
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-base.css" />
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-medium.css" />

 </head>
 <body class="docs"><div class="navbar navbar-fixed-top">
  <div class="navbar-inner clearfix">
    <ul class="nav" style="width: 100%">
      <li style="float: left;"><a href="migration81.html">« 从 PHP 8.0.x 移植到 PHP 8.1.x</a></li>
      <li style="float: right;"><a href="migration81.new-classes.html">新的类和接口 »</a></li>
    </ul>
  </div>
</div>
<div id="breadcrumbs" class="clearfix">
  <ul class="breadcrumbs-container">
    <li><a href="index.html">PHP Manual</a></li>
    <li><a href="migration81.html">从 PHP 8.0.x 移植到 PHP 8.1.x</a></li>
    <li>新特性</li>
  </ul>
</div>
<div id="layout">
  <div id="layout-content"><div id="migration81.new-features" class="sect1">
 <h2 class="title">新特性</h2>

 <div class="sect2" id="migration81.new-features.core">
  <h3 class="title">PHP 核心</h3>

  <div class="sect3" id="migration81.new-features.core.octal-literal-prefix">
   <h4 class="title">八进制整数文字表达前缀</h4>

   <p class="para">
    类似于二进制和十六进制字面量表达方式，现在八进制整数可以在表示中使用更为清晰地前缀 <code class="literal">0o</code>/<code class="literal">0O</code> 。
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />014</span><span style="color: #007700">;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;无前缀的八进制表示<br /></span><span style="color: #0000BB">0o14</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;添加前缀的八进制表示<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   
  </div>

  <div class="sect3" id="migration81.new-features.core.unpacking-string-keys">
   <h4 class="title">支持字符串类型键的数组解包</h4>

   <p class="para">
    新增<a href="language.types.array.html#language.types.array.unpacking" class="link">字符串类型键的数组解包</a>。
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$arr1&nbsp;</span><span style="color: #007700">=&nbsp;[</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'a'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'b'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$arr2&nbsp;</span><span style="color: #007700">=&nbsp;[...</span><span style="color: #0000BB">$arr1</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'c'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'d'</span><span style="color: #007700">];&nbsp;</span><span style="color: #FF8000">//[1,&nbsp;'a'&nbsp;=&gt;&nbsp;'b',&nbsp;'c'&nbsp;=&gt;&nbsp;'d']<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   
  </div>

  <div class="sect3" id="migration81.new-features.core.named-arg-after-unpack">
   <h4 class="title">参数展开后命名参数</h4>

   <p class="para">
    现在可以在参数展开后为命名参数。
    
    例如：
    foo(...$args, named: $arg).
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.core.upload-full-path-key">
   <h4 class="title">文件上传新增 full-path 键</h4>

   <p class="para">
    现在文件上传新增了额外的 <code class="literal">full_path</code> 键，
    这包含了上传文件的完整路径（不仅仅是返回路径中的文件名部分）。
    这是为了与 “upload webkitdirectory” 结合使用。
   </p>
   
  </div>

  <div class="sect3" id="migration81.new-features.core.enums">
   <h4 class="title">枚举</h4>

   <p class="para">
    新增<a href="language.enumerations.html" class="link">枚举</a>支持。
    
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.core.fibers">
   <h4 class="title">纤程</h4>

   <p class="para">
    新增功能详见 <a href="language.fibers.html" class="link">Fibers</a> 。
    
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.core.callable-syntax">
   <h4 class="title">First Class 可调用语法</h4>

   <p class="para">
    现在可调用闭包可以使用 <a href="functions.first_class_callable_syntax.html" class="link"><code class="code">myFunc(...)</code>
    语法</a>创建，与 <code class="code">Closure::fromCallable(&#039;myFunc&#039;)</code> 效果一样。
    
   </p>
   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
      <code class="code">...</code> 是语法的一部分，不是省略。
    </span>
   </p></blockquote>
  </div>

  <div class="sect3" id="migration81.new-features.core.intersection-types">
   <h4 class="title">交集类型</h4>

   <p class="para">
    新增功能详见<a href="language.types.declarations.html#language.types.declarations.composite.intersection" class="link">交集类型</a>。
    
   </p>
   <div class="caution"><strong class="caution">警告</strong>
    <p class="simpara">
     <a href="language.types.declarations.html#language.types.declarations.composite.intersection" class="link">交集类型</a>不能与<a href="language.types.declarations.html#language.types.declarations.composite.union" class="link">联合类型</a> 一起使用。
    </p>
   </div>
  </div>

  <div class="sect3" id="migration81.new-features.core.never-type">
   <h4 class="title">Never 类型</h4>

   <p class="para">
    新增一个新的仅仅返回类型 <span class="type"><span class="type never">never</span></span>。它表示函数要么
    <span class="function"><a href="function.exit.html" class="function">exit()</a></span> ，要么抛出异常，要么不会终止。
    
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.core.new-in-initializer">
   <h4 class="title">在初始化中 <a href="language.oop5.basic.html#language.oop5.basic.new" class="link"><code class="literal">new</code></a></h4>

   <p class="para">
    现在可以将 <code class="code">new ClassName()</code>
    语句作为参数、静态变量、初始化全局常量、注解参数的默认值。现在对象可以作为
    <span class="function"><a href="function.define.html" class="function">define()</a></span> 的参数了。
    
   </p>
   
  </div>

  <div class="sect3" id="migration81.new-features.core.readonly">
   <h4 class="title">Readonly 属性</h4>

   <p class="para">
    详见 <a href="language.oop5.properties.html#language.oop5.properties.readonly-properties" class="link">readonly</a> 。
    
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.core.final-constants">
   <h4 class="title">Final 类常量</h4>

   <p class="para">
    详见 <a href="language.oop5.final.html#language.oop5.final.example.php81" class="link"> <span class="modifier">final</span>
    常量修饰符</a>。而且，接口常量默认可覆盖。。
    
   </p>
  </div>

 </div>

 <div class="sect2" id="migration81.new-features.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   新增 <strong><code>CURLOPT_DOH_URL</code></strong> 选项。
  </p>

  <p class="para">
   libcurl 版本 &gt;= 7.71.0 时增加 blob 证书选项：
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_ISSUERCERT_BLOB</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_PROXY_ISSUERCERT</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_PROXY_ISSUERCERT_BLOB</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_PROXY_SSLCERT_BLOB</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_PROXY_SSLKEY_BLOB</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_SSLCERT_BLOB</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>CURLOPT_SSLKEY_BLOB</code></strong></span>
   </li>
  </ul>

  <p class="para">
   增加 <span class="classname"><a href="class.curlstringfile.html" class="classname">CURLStringFile</a></span> 类，它能够直接将字符串（不是文件）作为文件上传。
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$file&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">CURLStringFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'filename.txt'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'text/plain'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$curl</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">CURLOPT_POSTFIELDS</span><span style="color: #007700">,&nbsp;[</span><span style="color: #DD0000">'file'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$file</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
    </div>

   </div>
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.fpm">
  <h3 class="title">FPM</h3>

  <p class="para">
   新增 openmetrics 数据格式。Prometheus 可以用它来获取 FPM 的监测指标。
  </p>
  <p class="para">
   动态进程管理模式下，新增 <code class="literal">pm.max_spawn_rate</code> 设置。该设置在动态模式下会更快生成初始数量的子进程。
   默认值为 <code class="literal">32</code> ，这在以前是硬编码值。
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.gd">
  <h3 class="title">GD</h3>

  <p class="para">
   如果在编译安装 libgd 时添加 AVIF 依赖包，现在通过 <span class="function"><a href="function.imagecreatefromavif.html" class="function">imagecreatefromavif()</a></span> 和
   <span class="function"><a href="function.imageavif.html" class="function">imageavif()</a></span> 函数可获得 AVIF 图片格式，
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.hash">
  <h3 class="title">Hash</h3>

  <p class="para">
   现在，下列函数 <span class="function"><a href="function.hash.html" class="function">hash()</a></span>，
   <span class="function"><a href="function.hash-file.html" class="function">hash_file()</a></span>，和 <span class="function"><a href="function.hash-init.html" class="function">hash_init()</a></span>
   新增一个额外的 <code class="parameter">options</code> 参数，
   该参数作为特定数据传递给函数算法。
  </p>

  <div class="sect3" id="migration81.new-features.hash.murmurhash3">
   <h4 class="title">MurmurHash3</h4>

   <p class="para">
    新增对 <code class="literal">MurmurHash3</code> （支持流）的支持。有以下形式提供：
   </p>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">murmur3a, 32-bit hash</span>
    </li>
    <li class="listitem">
     <span class="simpara">murmur3c, 128-bit hash for x86</span>
    </li>
    <li class="listitem">
     <span class="simpara">murmur3f, 128-bit hash for x64</span>
    </li>
   </ul>

   <p class="para">
    hash 初始状态可以通过键为 <code class="literal">seed</code> 的 <code class="parameter">options</code> 数组传递，例如：

    <div class="informalexample">
     <div class="example-contents">
      <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$h&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"murmur3f"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">options</span><span style="color: #007700">:&nbsp;[</span><span style="color: #DD0000">"seed"&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">42</span><span style="color: #007700">]);<br />echo&nbsp;</span><span style="color: #0000BB">$h</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>

    seed 的有效值范围为 <code class="literal">0</code> 到系统定义的 <strong><code>UINT_MAX</code></strong>，通常是 <code class="literal">4294967295</code> 。
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.hash.xxhash">
   <h4 class="title">xxHash</h4>

   <p class="para">
    增加 <code class="literal">xxHash</code> 的支持。
    有以下形式提供：
   </p>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">xxh32, 32-bit hash</span>
    </li>
    <li class="listitem">
     <span class="simpara">xxh64, 64-bit hash</span>
    </li>
    <li class="listitem">
     <span class="simpara">xxh3, 64-bit hash</span>
    </li>
    <li class="listitem">
     <span class="simpara">xxh128, 128-bit hash</span>
    </li>
   </ul>

   <p class="para">
    hash 初始状态可以通过键为 <code class="literal">seed</code> 的 <code class="parameter">options</code> 数组传递，例如：
    <div class="informalexample">
     <div class="example-contents">
      <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$h&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"xxh3"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">options</span><span style="color: #007700">:&nbsp;[</span><span style="color: #DD0000">"seed"&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">42</span><span style="color: #007700">]);<br />echo&nbsp;</span><span style="color: #0000BB">$h</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>

    使用秘钥可以通过键为 <code class="literal">secret</code> 的 <code class="parameter">options</code> 数组传递，例如：
    <div class="informalexample">
     <div class="example-contents">
      <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$h&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"xxh3"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">options</span><span style="color: #007700">:&nbsp;[</span><span style="color: #DD0000">"secret"&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">"at&nbsp;least&nbsp;136&nbsp;bytes&nbsp;long&nbsp;secret&nbsp;here"</span><span style="color: #007700">]);<br />echo&nbsp;</span><span style="color: #0000BB">$h</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>

    自定义秘钥的质量对生成的散列质量至关重要。强烈建议秘钥尽可能使用最高标准的熵。
   </p>
  </div>
 </div>

 <div class="sect2" id="migration81.new-features.mysqli">
  <h3 class="title">MySQLi</h3>

  <div class="sect3" id="migration81.new-features.mysqli.local_infile_directory">
   <h4 class="title">新增 INI 设置 <code class="literal">mysqli.local_infile_directory</code></h4>

   <p class="para">
    新增 <a href="mysqli.configuration.html#ini.mysqli.local-infile-directory" class="link">mysqli.local_infile_directory</a>
    INI 设置，该设置可以指定允许加载文件的目录。这个设置只在禁用
    <a href="mysqli.configuration.html#ini.mysqli.allow-local-infile" class="link">mysqli.allow_local_infile</a>
    时才有意义，这种情况下允许加载任意的文件目录。
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.mysqli.bind-in-execute">
   <h4 class="title">execute 可绑定参数</h4>

   <p class="para">
    现在可以将参数以数组的形式传递给 <span class="methodname"><a href="mysqli-stmt.execute.html" class="methodname">mysqli_stmt::execute()</a></span>
    来绑定参数。所有值都以字符串的形式绑定。仅支持普通数组。当使用 libmysqlclient 编译
    MySQLi 时，这个新功能不可使用。
    
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$stmt&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prepare</span><span style="color: #007700">(</span><span style="color: #DD0000">'INSERT&nbsp;INTO&nbsp;users(id,&nbsp;name)&nbsp;VALUES(?,?)'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$stmt</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">execute</span><span style="color: #007700">([</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$username</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration81.new-features.mysqli.mysqli_fetch_column">
   <h4 class="title">新方法 <span class="methodname"><a href="mysqli-result.fetch-column.html" class="methodname">mysqli_result::fetch_column()</a></span></h4>

   <p class="para">
    新增 <span class="methodname"><a href="mysqli-result.fetch-column.html" class="methodname">mysqli_result::fetch_column()</a></span> 方法可以从结果集中获取单个标量值。
    新方法接收 <span class="type">int</span> 类型、从 0 开始，可选的 <code class="parameter">column</code> 参数，用于从指定行获取数据。
    
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$result&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT&nbsp;username&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;id&nbsp;=&nbsp;123'</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #0000BB">$result</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fetch_column</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
  </div>

 </div>

 <div class="sect2" id="migration81.new-features.pdo_mysql">
  <h3 class="title">PDO</h3>

  <p class="para">
   新增 <strong><code>PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY</code></strong> 常量，可用于指定可加载的文件目录。
   这个设置只在禁用 <strong><code>PDO::MYSQL_ATTR_LOCAL_INFILE</code></strong> 时才有意义，这种情况下允许加载任意的文件目录。
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.pdo_sqlite">
  <h3 class="title">PDO_SQLite</h3>

  <p class="para">
   现在已支持 SQLite 的 <code class="literal">&quot;file:&quot;</code> DSN 语法。
   可用于指定额外的标志。该功能在已设置 open_basedir 的情况下不能使用。
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'sqlite:file:path/to/sqlite.db?mode=ro'</span><span style="color: #007700">)<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
    </div>

   </div>
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.posix">
  <h3 class="title">POSIX</h3>

  <p class="para">
   新增 <strong><code>POSIX_RLIMIT_KQUEUES</code></strong> 和 <strong><code>POSIX_RLIMIT_NPTS</code></strong> 。
   这些 rlimits 只在 FreeBSD 可用。
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.standard">
  <h3 class="title">Standard</h3>

  <p class="para">
   现在 <span class="function"><a href="function.fputcsv.html" class="function">fputcsv()</a></span> 新增参数
   <code class="parameter">eol</code> ，这个参数允许自定义数据的行尾值，默认值是 <code class="literal">&quot;\n&quot;</code> 。
  </p>
 </div>

 <div class="sect2" id="migration81.new-features.spl">
  <h3 class="title">PHP 标准库（SPL）</h3>

  <p class="para">
   现在 <span class="methodname"><a href="splfileobject.fputcsv.html" class="methodname">SplFileObject::fputcsv()</a></span> 新增参数
   <code class="parameter">eol</code> ，这个参数允许自定义数据的结束位置，默认值保持不变，还是 <code class="literal">&quot;\n&quot;</code> 。
  </p>
 </div>

</div></div></div></body></html>